/**   
*
* @创建人：Liuyong   
* @创建时间：2013-11-8 下午01:00:48   
*    
*/ 
package com.crmsys.common.util;

import java.math.BigInteger;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.util.Assert;

import com.crmsys.auth_framework.auth.model.CUser;
import com.crmsys.common.constant.AuthConstants;
import com.crmsys.common.security.rsa.RSA;

/**   
 *
 * @描述：   Session工具
 * @创建人：Liuyong   
 * @创建时间：2013-11-8 下午01:00:48   
 * @修改人：Liuyong   
 * @修改时间：2013-11-8 下午01:00:48   
 * @修改备注：   
 * @version 1.0
 *    
 */
public class SessionUtil {
	
       /**
        * 
       *@param request
       *@return
       *@throws Exception
       * @描述：   获取用户信息
       * @创建人：Liuyong   
       * @创建时间：2013-11-8 下午01:45:52   
       * @修改人：Liuyong   
       * @修改时间：2013-11-8 下午01:45:52   
       * @修改备注：   
       * @version 1.0
       *
        */
	  public static CUser getLoginUserInfo(HttpServletRequest request) throws Exception{
		    Assert.notNull(request);
		    return (CUser)request.getSession(true).getAttribute(AuthConstants.SESSION_USER_INFO);
		    
		  }
	  /**
	   * 功能：生成一个随机数，并保存于SESSION中，仅供一次使用,该方法在数据需要保密时都要重新调用并生成
	   * @return 随机数
	   * 
	   */
	  public static RSAPublicKey genRandom(HttpServletRequest request){
	    try{
	      KeyPair kp = RSA.generateKeyPair();
	      RSAPublicKey rsap = (RSAPublicKey)kp.getPublic();
	      request.getSession(true).setAttribute(AuthConstants.SESSION_LOGIN_RANDOM,(RSAPrivateKey)kp.getPrivate());
	      return rsap;    
	    }catch(Exception e){
	      return null;
	    }
	  }
	  /**
	   * 功能：将加密后的数据用来解析并获取用户名，密码
	  * @param request 请求
	  * @return 随机数
	  * 
	  */
	 public static Map<String,String> decryptUsernameAndPasswd(HttpServletRequest request,String userName, String password){
	   Map<String,String> map= new HashMap();
	   try{
		   PrivateKey pk=(PrivateKey)request.getSession(true).getAttribute(AuthConstants.SESSION_LOGIN_RANDOM);
	       String ua[] = userName.split(" ");//用户名数组
	       String up[] = password.split(" ");//密码数据
		   byte[] en_results = hexStringToBytes(userName);
	       userName ="";//置空
	       password ="";	       
	       for (int i=0;i<ua.length;i++){
	    	   userName +=(new StringBuffer(new String(RSA.decrypt(pk, new BigInteger(ua[i],16).toByteArray())))).reverse().toString();
	       }
	       for (int i=0;i<up.length;i++){
	         password +=(new StringBuffer(new String(RSA.decrypt(pk, new BigInteger(up[i],16).toByteArray())))).reverse().toString();
	       }       
	       map.put("userName",  userName);
	       map.put("password",  password);
	   }catch(Exception e){
		   e.printStackTrace();
	     map.put("userName",  "");
	     map.put("password",  "");
	   }
	   request.getSession(true).removeAttribute(AuthConstants.SESSION_LOGIN_RANDOM);
	   return map;    
	 }
	 
	   /**
	    * 16进制 To byte[]
	    * @param hexString
	    * @return byte[]
	    */
	   public static byte[] hexStringToBytes(String hexString) {
	       if (hexString == null || hexString.equals("")) {
	           return null;
	       }
	       hexString = hexString.toUpperCase();
	       int length = hexString.length() / 2;
	       char[] hexChars = hexString.toCharArray();
	       byte[] d = new byte[length];
	       for (int i = 0; i < length; i++) {
	           int pos = i * 2;
	           d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
	       }
	       return d;
	   }
	   /**
	    * Convert char to byte
	    * @param c char
	    * @return byte
	    */
	    private static byte charToByte(char c) {
	       return (byte) "0123456789ABCDEF".indexOf(c);
	   }
	    /**
	     * 
	    *@param request
	    *@return
	    *@throws Exception
	    * @描述：   获取parentMenu
	    * @创建人：Liuyong   
	    * @创建时间：2013-11-17 下午02:56:51   
	    * @修改人：Liuyong   
	    * @修改时间：2013-11-17 下午02:56:51   
	    * @修改备注：   
	    * @version 1.0
	    *
	     */
	    public static List getParentMenu(HttpServletRequest request) throws Exception{
		    Assert.notNull(request);
		    return (List)request.getSession(true).getAttribute(AuthConstants.PARENT_MENU);
	    }
	    /**
	     * 
	    *@param request
	    *@return
	    *@throws Exception
	    * @描述：   获取childMenu
	    * @创建人：Liuyong   
	    * @创建时间：2013-11-17 下午02:56:51   
	    * @修改人：Liuyong   
	    * @修改时间：2013-11-17 下午02:56:51   
	    * @修改备注：   
	    * @version 1.0
	    *
	     */
	    public static List getChildMenu(HttpServletRequest request) throws Exception{
		    Assert.notNull(request);
		    return (List)request.getSession(true).getAttribute(AuthConstants.CHILD_MENU);
	    }
}
